home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / stdio / freopen.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  1KB  |  45 lines

  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include <stdarg.h>
  5. #include <stdlib.h>
  6.  
  7. #include <dos/dos.h>
  8. #include <proto/dos.h>
  9.  
  10. extern FILE *_firstfile,*_lastfile;
  11. extern char *_stdin,*_stdout,*_stderr;
  12.  
  13. FILE *freopen(const char *name,const char *mode,FILE *f)
  14. {
  15.     long amigamode=0;int append;
  16.     if(f->filehandle){
  17.         fflush(f);
  18.         if(f->filehandle!=_stdin&&f->filehandle!=_stdout&&f->filehandle!=_stderr)
  19.             Close((BPTR)f->filehandle);   /*  hier returncode auswerten   */
  20.         if(f->prev) f->prev->next=f->next; else _firstfile=f->next;
  21.         if(f->next) f->next->prev=f->prev; else _lastfile=f->prev;
  22.         if(f->base&&!(f->flags&_NOTMYBUF)) free(f->base-1);
  23.     }
  24.     if(*mode=='w') amigamode=MODE_NEWFILE; else amigamode=MODE_OLDFILE;
  25.     if(*mode=='a') append=1; else append=0;
  26.     f->count=0;
  27.     f->base=0;
  28.     f->bufsize=0;
  29.     f->next=0;
  30.     if(*mode=='r') f->flags=_READABLE; else f->flags=_WRITEABLE;
  31.     if(*++mode=='b') mode++;
  32.     if(*mode=='+') {f->flags|=_READABLE|_WRITEABLE;amigamode=MODE_READWRITE;}
  33.     f->filehandle=(char *)Open((STRPTR)name,amigamode);
  34.     if(!f->filehandle){free(f);return(0);}
  35.     if(IsInteractive((BPTR)f->filehandle)) f->flags|=_LINEBUF;
  36.     if(_lastfile){
  37.         _lastfile->next=f;f->prev=_lastfile;_lastfile=f;
  38.     }else{
  39.         _firstfile=_lastfile=f;
  40.     }
  41.     if(append) fseek(f,0,SEEK_END);
  42.     return(f);
  43. }
  44.  
  45.